Various approaches to designing computer processors have led to a myriad of different processing platforms available today. For example, available central processing units (CPUs) now include processors that rely on Complex Instruction Set Computing (CISC) and other processors that rely on Reduced Instruction Set Computing (RISC). Specialized processors are also available such as Graphics Processing Units (GPUs), Digital Signal Processors (DSPs), etc., which are optimized for functions such as video processing, audio, motor control, and the like. Further processor types include Field Programmable Gate Arrays (FPGAs), which typically include millions of logic gates that can be configured to implement customized hardware that is optimized for a particular computation task. Additionally, Application Specific Integrated Circuits (ASICs) are also available, which include hardware solutions optimized for specific tasks (e.g., cryptographic processing, mining Bitcoins, video transcoding, etc.).
In general, heterogeneous computing environments attempt to leverage different types of processor architectures in the hopes of better matching the specific needs of the application software to the available architectures. For example, an application may use the GPU of the device for video rendering and the CPU of the device for other computational tasks. However, GPUs have also proven to be capable of handling compute-intensive tasks, thereby offering a programmatic choice to be made between processors. The assignment of various parts of the target computational algorithms to each type of processor must be made carefully to optimize factors such as: physical space, power dissipation, performance of the applications, etc. As the number of processors and processor types in a heterogeneous computing environment increase, so too do the number of options available as to where a given task or application is executed.